package com.hzw.saas.api.hpc;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hzw.saas.api.hpc.bo.HpcContractBO;
import com.hzw.saas.api.hpc.bo.HpcContractStructBO;
import com.hzw.saas.api.hpc.query.*;
import com.hzw.saas.common.config.util.PageParam;

import java.util.List;

/**
 * 合同登记接口服务
 *
 * @Description
 * @Date 2021/7/15 5:49 下午
 * @Created by sonam
 */
public interface IHpcContractService {

    /**
     * 通用查询
     */
    List<HpcContractBO> query(HpcContractBO hpcContractBO);

    /**
     * 插入合同数据，如果没有绑定HPC账号的用户，初始化合同数据
     *
     * @param createHpcContractQuery
     * @return
     */
    HpcContractBO boundContract(CreateHpcContractQuery createHpcContractQuery);

    /**
     * 登记或者更新合同信息
     *
     * @param contractRegistrationQuery
     */
    HpcContractBO registrationOrUpdateContract(ContractRegistrationQuery contractRegistrationQuery);

    /**
     * 主键查询
     *
     * @param contractId
     * @return
     */
    HpcContractBO getById(String contractId);

    void deleteCacheById(String contractId);

    /**
     * 校验合同是否有效
     *
     * @param contractId
     * @return
     */
    HpcContractBO checkContract(String contractId);

    /**
     * 校验合同是否有效
     *
     * @param hpcContractBO
     * @return
     */
    HpcContractBO checkContract(HpcContractBO hpcContractBO);

    /**
     * 合同使用
     *
     * @param contractUsableQuery
     */
    boolean contractUsable(ContractUsableQuery contractUsableQuery);

    /**
     * 试用合同
     * @param trialContractQuery
     */
    void trialContract(TrialContractQuery trialContractQuery);

    /**
     * 删除合同
     *
     * @param contractId   合同主键
     * @param deleteExpire 是否强制删除过期合同
     */
    boolean deleteContract(String contractId, boolean deleteExpire);

    /**
     * 删除合同
     *
     * @param contractIds  合同主键
     * @param deleteExpire 是否强制删除过期合同
     */
    boolean deleteContracts(List<String> contractIds, boolean deleteExpire);

    /**
     * 根据用户ID获取合同列表
     *
     * @param userIds
     * @param keyWord
     * @param status
     * @param contractType
     * @return
     */
    IPage<HpcContractBO> listByUserIds(PageParam pageParam, List<String> userIds, String keyWord, Integer status, Integer contractType, List<String> prodviderCodes);

    /**
     * 根据用户ID获取合同列表
     *
     * @param userIds
     * @param keyword
     * @param status
     * @param contractType
     * @return
     */
    IPage<HpcContractBO> listByUserIds(PageParam pageParam, List<String> userIds, String keyword, Integer status, Integer contractType, List<String> prodviderCodes, String creatorId);


    /**
     * 根据客户条件检索出 合同对应的userId
     *
     * @param pageParam           分页
     * @param searchContractQuery 条件为空返回null
     * @return
     */
    IPage<String> listContractUserIdByCondition(PageParam pageParam, SearchContractQuery searchContractQuery);

    /**
     * 分页获取合同报表
     *
     * @param pageParam
     * @param searchContractQuery
     * @return
     */
    IPage<HpcContractStructBO> listContractPageByUserIds(PageParam pageParam, SearchContractQuery searchContractQuery);

    /**
     * 合同解绑，操作不可逆
     * @param contractIds
     * @param force 是否强制解绑
     */
    void unboundContract(List<String> contractIds, boolean force);

    /**
     * 创建并绑定青云HPC账号
     * @param qingCloudContractUsableQuery
     */
    void createAndBoundQCloudHpc(QingCloudContractUsableQuery qingCloudContractUsableQuery);

}
